package com.fileupload.monitor;

import com.fileupload.config.MonitorConfig;
import com.fileupload.upload.FileUploadService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.io.File;

/**
 * 文件变更监听器实现类
 * 监听文件的创建、修改、删除事件
 * @author 小乙
 */
@Component
public class UploadFileChangeListener implements FileChangeListener {
    private static final Logger logger = LoggerFactory.getLogger(UploadFileChangeListener.class);
    
    @Autowired
    private FileUploadService fileUploadService;
    
    @Override
    public void onFileCreated(File file, MonitorConfig monitorConfig) {
        logger.info("[文件变更监听进程] 检测到新文件创建，开始处理文件: {}", file.getAbsolutePath());
        logger.info("[文件变更监听进程] 文件信息 - 名称: {}, 大小: {}字节, 监控组: {}", 
                file.getName(), file.length(), monitorConfig.getName());
        
        try {
            String monitorSuffix = monitorConfig.getMonitorFileSuffix();
            String uploadSuffix = monitorConfig.getUploadFileSuffix();
            
            // 情况1：配置了monitorFileSuffix（完成标识）
            if (monitorSuffix != null && !monitorSuffix.trim().isEmpty()) {
                // 检查当前文件是否是完成标识文件
                if (file.getName().endsWith(monitorSuffix)) {
                    // 构造对应的上传文件路径（支持多种文件命名模式）
                    String baseName = file.getName().substring(0, file.getName().length() - monitorSuffix.length());
                    String uploadFileName;
                    
                    // 如果明确配置了上传文件后缀，则使用配置的后缀
                    if (uploadSuffix != null && !uploadSuffix.trim().isEmpty()) {
                        uploadFileName = baseName + uploadSuffix;
                    } else {
                        // 没有配置上传文件后缀时，尝试多种匹配策略
                        uploadFileName = baseName;
                    }
                    
                    File uploadFile = new File(file.getParent(), uploadFileName);
                    
                    // 如果找不到直接匹配的文件，尝试查找同名但带有扩展名的文件
                    if (!uploadFile.exists() || !uploadFile.isFile()) {
                        logger.info("[文件变更监听进程] 直接匹配失败，尝试查找同名但带扩展名的文件: {}", baseName);
                        
                        // 获取目录中所有文件
                        File[] files = file.getParentFile().listFiles();
                        if (files != null) {
                            for (File candidate : files) {
                                // 查找文件名（不含扩展名）等于baseName的文件
                                String candidateName = candidate.getName();
                                int lastDotIndex = candidateName.lastIndexOf('.');
                                String candidateBaseName = lastDotIndex > 0 ? 
                                        candidateName.substring(0, lastDotIndex) : candidateName;
                                
                                if (candidateBaseName.equals(baseName) && candidate.isFile()) {
                                    uploadFile = candidate;
                                    logger.info("[文件变更监听进程] 找到匹配的上传文件: {}", uploadFile.getAbsolutePath());
                                    break;
                                }
                            }
                        }
                    }
                    
                    if (uploadFile.exists() && uploadFile.isFile()) {
                        logger.info("[文件变更监听进程] 检测到完成标识文件，准备上传对应文件: {}", uploadFile.getAbsolutePath());
                        fileUploadService.uploadFile(uploadFile, monitorConfig);
                        logger.info("[文件变更监听进程] 对应文件上传处理完成: {}", uploadFile.getAbsolutePath());
                    } else {
                        logger.warn("[文件变更监听进程] 完成标识文件存在，但对应上传文件不存在: {}", uploadFileName);
                    }
                }
                // 如果是完成标识文件才处理，其他文件跳过
            }
            // 情况2：没有配置monitorFileSuffix，但配置了uploadFileSuffix
            else if (uploadSuffix != null && !uploadSuffix.trim().isEmpty()) {
                // 检查当前文件是否匹配上传文件后缀
                if (file.getName().endsWith(uploadSuffix)) {
                    logger.info("[文件变更监听进程] 匹配上传文件后缀，开始上传: {}, 监控配置: {}", 
                            file.getAbsolutePath(), monitorConfig.getName());
                    fileUploadService.uploadFile(file, monitorConfig);
                    logger.info("[文件变更监听进程] 文件上传处理完成: {}", file.getAbsolutePath());
                }
            }
            // 情况3：两项都没有配置，上传所有文件
            else {
                logger.info("[文件变更监听进程] 无后缀限制，开始上传所有文件: {}, 监控配置: {}", 
                        file.getAbsolutePath(), monitorConfig.getName());
                fileUploadService.uploadFile(file, monitorConfig);
                logger.info("[文件变更监听进程] 文件上传处理完成: {}", file.getAbsolutePath());
            }
        } catch (Exception e) {
            logger.error("[文件变更监听进程] 处理文件创建事件异常: {}, 文件: {}, 异常详情: {}", 
                    e.getMessage(), file.getAbsolutePath(), e);
        }
    }
    
    @Override
    public void onFileModified(File file, MonitorConfig monitorConfig) {
        // 对于修改事件，可以根据需要决定是否处理
        // 例如，可以监控文件大小变化，当文件不再增长时认为写入完成
        logger.info("[文件变更监听进程] 文件已修改: {}, 监控组: {}", 
                file.getAbsolutePath(), monitorConfig.getName());
        logger.info("[文件变更监听进程] 修改后文件大小: {}字节", file.length());
        
        // 这里可以添加文件完成写入的判断逻辑
        // 例如：检查文件大小是否在一段时间内保持不变
    }
    
    @Override
    public void onFileDeleted(File file, MonitorConfig monitorConfig) {
        // 对于删除事件，可以记录日志或进行其他处理
        logger.info("[文件变更监听进程] 文件已删除: {}, 监控组: {}", 
                file.getAbsolutePath(), monitorConfig.getName());
    }
}